﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SistemaLib.sipe.validate
{
    public static class Validator
    {
        /// <summary>
        ///     Dado un valor a evaliar "val" y un rango de valores "from" - "to" se devuelve true si el valor se encuetra
        ///     comprendido en dicho rango y false en caso contrario.
        ///     Admite los siguientes tipos de valores: -int -decimal -float -double -DateTime
        /// </summary>
        /// <param name="from">valor desde el cual se considera valido el valor a evaluar</param>
        /// <param name="to">valor hasta el cual se considera valido el valor a evaluar</param>
        /// <param name="val">valor a evaluar</param>
        /// <returns></returns>
        /// 

        public static bool ValidateRange(object from, object to, object val)
        {            
            Type type = val.GetType();

            try
            {
                switch (type.Name.ToLower())
                {
                    case "int32":
                    case "int64":
                    case "decimal":
                    case "double":
                    case "float":
                    {
                        double castedVal = Double.Parse(val.ToString());
                        double castedFrom = Double.Parse(from.ToString());
                        double castedTo = Double.Parse(to.ToString());

                        if ((castedFrom <= castedVal) && castedVal <= castedTo)
                            return true;

                        break;
                    }
                    case "datetime":
                    {
                        DateTime castedVal = (DateTime)val;
                        DateTime castedFrom = (DateTime)from;
                        DateTime castedTo = (DateTime)to;

                        if ((castedFrom <= castedVal) && castedVal <= castedTo)
                            return true;

                        break;
                    }
                    default:
                    {
                        return false;
                    }
                }
            }
            catch
            {
                return false;
            }

            return false;
        }

        /// <summary>
        /// Valida el cuit ingresado por parametro.
        /// </summary>
        /// <param name="cuit">nro de cuit, 11 digitos sin separaciones. Ejemplo: 20107807773</param>
        /// <returns></returns>
        public static bool Validar(string cuit)
        {
            if (cuit.Length != 11)
            {
                return false;
            }

            int suma, resto, digito;

            digito = Convert.ToInt32(cuit.Substring(10, 1));

            suma = 0;
            suma = suma + Convert.ToInt32(cuit.Substring(0, 1)) * 5;
            suma = suma + Convert.ToInt32(cuit.Substring(1, 1)) * 4;
            suma = suma + Convert.ToInt32(cuit.Substring(2, 1)) * 3;
            suma = suma + Convert.ToInt32(cuit.Substring(3, 1)) * 2;

            suma = suma + Convert.ToInt32(cuit.Substring(4, 1)) * 7;
            suma = suma + Convert.ToInt32(cuit.Substring(5, 1)) * 6;
            suma = suma + Convert.ToInt32(cuit.Substring(6, 1)) * 5;
            suma = suma + Convert.ToInt32(cuit.Substring(7, 1)) * 4;
            suma = suma + Convert.ToInt32(cuit.Substring(8, 1)) * 3;
            suma = suma + Convert.ToInt32(cuit.Substring(9, 1)) * 2;
            suma = suma + Convert.ToInt32(cuit.Substring(10, 1)) * 1;

            resto = suma % 11;


            if (resto != 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }



        
    }
}
